package com.song.boot.springstudy.redis.clean;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class ReferenceQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个引用队列
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        
        // 创建一个对象并关联弱引用和队列
        Object strongRef = new Object();
        WeakReference<Object> weakRef = new WeakReference<>(strongRef, queue);
        
        // 断开强引用，使对象仅被弱引用持有
        strongRef = null;
        
        // 手动触发GC
        System.gc();
        
        // 等待引用对象进入队列
        Reference<? extends Object> polledRef = queue.poll();
        if (polledRef == null) {
            System.out.println("对象尚未被回收，等待中...");
            System.out.println(queue.remove());
            polledRef = queue.remove(1000); // 最多等待1秒
        }
        if (polledRef != null) {
            System.out.println("对象已被回收，关联的弱引用：" + polledRef);
            // 可以在这里执行资源清理操作
        } else {
            System.out.println("超时：对象未被回收或GC未触发");
        }
    }
}